package com.wms.ymcc.exception;

import com.wms.ymcc.constant.GlobalExceptionConstants;
import com.wms.ymcc.result.JSONResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.nio.file.AccessDeniedException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author : 阿盛哟
 * @description : 全局异常处理器
 * @createDate : 2025/5/27 10:15
 */
@RestControllerAdvice   //===ControllerAdvice+ResponseBody
public class GlobalExceptionHandler {
    /**
     * 系统异常处理  系统异常
     * @param e
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    public JSONResult defaultErrorHandler(Exception e) {
        e.printStackTrace();
        //  访问权限不足
        if (e.getClass().getSimpleName().equals("AccessDeniedException")) {
            return JSONResult.error(GlobalExceptionConstants.USER_NOT_PERMISSION);
        }
        return JSONResult.error(GlobalExceptionConstants.New_MA);
    }

    /**
     * 参数校验异常处理
     * @param e
     * @return
     */
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public JSONResult methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
        e.printStackTrace();//  打印错误信息
        //  获取所有错误信息
        List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
        // 拼接错误信息
        StringBuffer stringBuffer = new StringBuffer();
        //  遍历错误信息
        allErrors.forEach(objectError ->
                // 拼接错误信息
                stringBuffer.append(objectError.getDefaultMessage()).append(";"));
        return JSONResult.error(stringBuffer.toString());//  返回错误信息
    }



    /**
     * 自定义异常处理  业务异常
     * @param e
     * @return
     */
    @ExceptionHandler(value = GlobalBaseException.class)
    public JSONResult GlobalBaseExceptionHandler(Exception e) {
        e.printStackTrace();
        return JSONResult.error(e.getMessage(),"50002");
    }


}